package com.objectproject.main.service.subsystem.validation;

import java.util.ArrayList;

import com.objectproject.main.enumeration.ValueType;
import com.objectproject.main.exception.NotProperToInsertException;
import com.objectproject.main.model.MyObject;
import com.objectproject.main.model.MyProperty;

/**
 * 모델이 입력될 때 인스턴스 변수들이 적절히 설정되었는지 검사
 */
public class ObjectValidator{
	
	public static void onInsertMyObject(MyObject myObject) throws NotProperToInsertException{
		
		if(myObject.getObjectId() != 0L)
			throw new NotProperToInsertException("오브젝트 ID가 0이 아님");
		if(myObject.getMyProperties() == null)
			throw new NotProperToInsertException("프로퍼티 목록이 NULL");
		if(myObject.getRegDate() != null)
			throw new NotProperToInsertException("등록 일자가 NULL이 아님");
		
	}
	
	public static void onInsertMyProperty(MyProperty myProperty) throws NotProperToInsertException{
		
		if(myProperty.getPropertyId() != 0L)
			throw new NotProperToInsertException("프로퍼티 ID가 0이 아님");
		if(myProperty.getTypeOfValue() == null)
			throw new NotProperToInsertException("값 타입이 NULL");
		if(myProperty.getTypeOfValue() == ValueType.OBJECT && myProperty.getTypeObjectQualifier() == null)
			throw new NotProperToInsertException("값 타입이 OBJECT 이지만 검증 규칙이 없음");
	
	}
	
	public static void onLoadMyPropertyValuesOf(MyObject myObject) throws NotProperToInsertException{
		
		ArrayList<MyProperty> myProperties = null;
		
		if(myObject.getMyProperties() == null)
			throw new NotProperToInsertException("오브젝트의 프로퍼티 목록이 NULL");

		myProperties = myObject.getMyProperties();
		for(int i = 0 ; i < myProperties.size() ; i++){
			if(myProperties.get(i).getValueId() == 0L )
				throw new NotProperToInsertException(i + "번째 프로퍼티의 값 ID가 0");
			if(myProperties.get(i).getValue() != null )
				throw new NotProperToInsertException(i + "번째 프로퍼티의 값이 NULL이 아님");
			if(myProperties.get(i).getTypeOfValue() == null )
				throw new NotProperToInsertException(i + "번째 프로퍼티의 값 타입이 NULL");
			if(myProperties.get(i).getTypeOfValue() == ValueType.OBJECT && myProperties.get(i).getTypeObjectQualifier() == null )
				throw new NotProperToInsertException(i + "번째 프로퍼티의 값 타입이 OBJECT 이지만 검증 규칙이 없음");
			
		}
	}
}
